package com.Arrays_;

import java.awt.print.Book;
import java.util.Comparator;

/**
 * @Author 小闽
 * @Date 2024/10/9 11:21
 * @PackageName: com.Arrays_
 * @ClassName: ArrayExercise
 * @Description: Arrays练习
 * @Version 1.0
 */
public class ArrayExercise {
    public static void main(String[] args) {
        /**
         * 案例：自定义 Book 类，里面包含 name 和 price, 按照 price 排序（从大到小）。
         *      要求使用两种方式排序，有一个 Book[] books = 4 本书的对象。
         *      使用前面学习过的传递实现 Comparator 接口匿名内部类，也称为定义排序。可以
         *      按照 price （1） 从大到小 （2） 从小到大 （3） 按照书名长度从大到小
         *
         *      思路分析 + 步骤拆解：
         *          第一步：先定义一个 Book 类，类中定义书名和价格属性，创建构造器并初始化对象
         *          第二步：编写一个排序方法（从小到大或从大到小）定制排序
         *               第二步小步拆解：
         *                    ① 编写一个 bubbleSort() 方法，传入书本对象参数，传入一个接口 Comparator c 对象
         *                    ② 使用 for 循环对象数据中的元素，调用 c.compare() 方法传入书本的价格，判断第j个元素和第j+1个元素的大小
         *                    ③ 根据②传入书的价格，去主方法中调用bubbleSort()方法中实现的匿名内部类的compare()方法进行比较
         *                      在if中添加判断书名长度的逻辑判断
         *                    ④ 根据大于0还是小于0进行是否交换
         *          第三步：在主方法中去实例化 Book 类对象，并初始化4个 Book 对象
         *
         */
        Book1[] book1 = new Book1[4];
        book1[0] = new Book1("红楼梦", 100);
        book1[1] = new Book1("金瓶梅新", 90);
        book1[2] = new Book1("青年文摘20年", 5);
        book1[3] = new Book1("java从入门到放弃~", 300);

        bubbleSort(book1, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Book1 book11 = (Book1) o1;
                Book1 book12 = (Book1) o2;
                double price =  book12.getPrice() - book11.getPrice();
                // 在这里因为价格是double类型，所以不能直接转换为int类型
                // 需要进行一个判断条件，>0 <0 =0 根据返回的结果去判断是否要进行排序
                if (price > 0){
                    return 1;
                }else if (price < 0){
                    return -1;
                }else {
                    return 0;
                }
            }
        });
        bubbleSort(book1, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Book1 book11 = (Book1) o1;
                Book1 book12 = (Book1) o2;
                return book12.getName().length() - book11.getName().length();
            }
        });
        System.out.println("===排序后的书本价格===");
        for (int i = 0; i < book1.length; i++) {
            System.out.println(book1[i]);
        }
    }

    public static void bubbleSort(Book1[] book1s, Comparator c) {
        Book1 temp;
        for (int i = 0; i < book1s.length - 1; i++) {
            for (int j = 0; j < book1s.length - 1 - i; j++) {
                if (c.compare(book1s[j], book1s[j + 1]) > 0) {
                    temp = book1s[j];
                    book1s[j] = book1s[j + 1];
                    book1s[j + 1] = temp;
                }
            }
        }
    }
}

class Book1 {
    private String name;
    private double price;

    public Book1(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return "Book1{" +
                "name='" + name + ", price=" + price;
    }
}